{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Digital Modulation"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a short Python example, let’s generate QPSK at baseband and plot the constellation.\n",
    "\n",
    "Even though we could generate the complex symbols directly, let’s start from the knowledge that QPSK has four symbols at 90-degree intervals around the unit circle. We will use 45, 135, 225, and 315 degrees for our points. First we will generate random numbers between 0 and 3 and perform math to get the degrees we want before converting to radians."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "num_symbols = 1000\n",
    "\n",
    "x_int  = np.random.randint(0, 4, num_symbols)\n",
    "x_degrees = x_int*90 + 45\n",
    "x_radians = x_degrees*(np.pi/180)\n",
    "# Derive rectangular coordinates from polar\n",
    "x_symbols = np.cos(x_radians)+1j*np.sin(x_radians) \n",
    "fig, axs = plt.subplots(2,2)\n",
    "axs[0, 0].plot(np.real(x_symbols), np.imag(x_symbols), '.')\n",
    "plt.grid(True)\n",
    "\n",
    "# Observe how all the symbols we generated overlap. \n",
    "# There’s no noise so the symbols all have the same value. Let’s add some noise:\n",
    "noise = np.random.randn(num_symbols) + 1j*np.random.randn(num_symbols)\n",
    "noise_pwr = 0.01\n",
    "r1 = x_symbols + noise * np.sqrt(noise_pwr)\n",
    "axs[0, 1].plot(np.real(r1), np.imag(r1), '.')\n",
    "plt.grid(True)\n",
    "\n",
    "# For those interested in simulating phase noise, which could result \n",
    "# from phase jitter within the local oscillator (LO), replace the r with:\n",
    "phase_noise = np.random.randn(len(x_symbols)) * 0.1 # adjust multiplier for \"strength\" of phase noise\n",
    "r2 = x_symbols * np.exp(1j*phase_noise)\n",
    "axs[1, 0].plot(np.real(r2), np.imag(r2), '.')\n",
    "plt.grid(True)\n",
    "\n",
    "# This was to test if r_test == r2. It's TRUE, which means\n",
    "# numpy is smart enough to do the conversion in the background\n",
    "x_sym_rho = np.abs(x_symbols)\n",
    "x_sym_phi = np.arctan2(np.imag(x_symbols), np.real(x_symbols))\n",
    "r_test = (x_sym_rho*np.exp(1j*x_sym_phi)) * np.exp(1j*phase_noise)\n",
    "\n",
    "# You could even combine phase noise \n",
    "# with AWGN to get the full experience:\n",
    "r = r1 + r2\n",
    "axs[1, 1].plot(np.real(r), np.imag(r), '.')\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
